package com.briup.service.impl;

import com.briup.exception.ServiceException;
import com.briup.mapper.UserMapper;
import com.briup.pojo.User;
import com.briup.pojo.dto.UserBaseDto;
import com.briup.pojo.dto.UserLogin;
import com.briup.pojo.dto.UserPageDto;
import com.briup.pojo.vo.UserPageVO;
import com.briup.response.ResultCode;
import com.briup.service.UserService;
import com.briup.utils.BeanCopyUtils;
import com.briup.utils.JwtUtil;
import com.github.pagehelper.Page;
import com.github.pagehelper.PageHelper;
import com.github.pagehelper.PageInfo;
import org.springframework.beans.factory.annotation.Autowired;
import org.springframework.stereotype.Service;
import org.springframework.util.StringUtils;

import java.time.LocalDateTime;
import java.util.HashMap;
import java.util.List;
import java.util.Map;

@Service
public class UserServiceImpl implements UserService {

	@Autowired
	private UserMapper userMapper;

	/**
	 * 用户登录逻辑处理
	 *
	 * @param userLogin 用户登录对象 内含用户名及密码
	 *                  后可添加验证码等数据
	 * @return String
	 */
	@Override
	public String login(UserLogin userLogin) {

		User user = userMapper.getUserByUsername(userLogin.getUsername());

		//判断用户是否存在及密码是否正确
		if (user == null || !userLogin.getPassword().equals(user.getPassword())) {
			throw new ServiceException(ResultCode.USER_LOGIN_ERROR);
		}

		//判断用户状态是否可用 用户状态(0正常，1禁用)
		if (user.getStatus() == 1) {
			throw new ServiceException(ResultCode.USER_ACCOUNT_FORBIDDEN);
		}

		Map<String, Object> userInfo = new HashMap<>();
		userInfo.put("id",user.getId());
		userInfo.put("username",user.getUsername());
		//生成JWT返回
		String jwt = JwtUtil.generateJwt(userInfo);
		return jwt;
	}

	/**
	 * 分页多条件查询用户信息
	 *
	 * @param userPageDto 用于封装分页多条件查询用户时的条件参数
	 */
	@Override
	public PageInfo<UserPageVO> getUsersPageByConditional(UserPageDto userPageDto) {
		//使用PageHelper开启分页,设置分页参数
		PageHelper.startPage(userPageDto.getPageNum(), userPageDto.getPageSize());

		//根据条件查询所有相关的用户
		List<User> userList = userMapper.getUserListByConditional(userPageDto);
		Page<User> page = (Page<User>) userList;

		//Bean拷贝
		List<UserPageVO> userPageVOS = BeanCopyUtils.copyBeanList(userList, UserPageVO.class);

		//封装在PageInfo对象中,并返回
		PageInfo<UserPageVO> pageInfo = new PageInfo<>(userPageVOS);
		//设置总条数
		pageInfo.setTotal(page.getTotal());

		return pageInfo;
	}

	/**
	 * 批量删除用户信息
	 * @param ids 用户ids
	 */
	@Override
	public void deleteUsers(List<Integer> ids) {
		userMapper.deleteUsers(ids);
	}


	/**
	 * 添加用户
	 *
	 * @param userBaseDto 用户添加的基础数据实体
	 */
	@Override
	public void addUser(UserBaseDto userBaseDto) {
		//参数校验,用户名密码等必要信息不能为空
		if (!StringUtils.hasText(userBaseDto.getUsername())
				|| !StringUtils.hasText(userBaseDto.getPassword())
				|| userBaseDto.getStatus() == null) {
			throw new ServiceException(ResultCode.PARAM_NOT_COMPLETE);
		}

		//判断注册的用户是否已经存在
		User userFromDB = userMapper.getUserByUsername(userBaseDto.getUsername());
		System.out.println(userFromDB);
		if (userFromDB != null) {
			throw new ServiceException(ResultCode.USER_HAS_EXISTED);
		}

		//如果用户未被注册,则继续注册,将参数实体内容拷贝到 用户实体中
		User user = BeanCopyUtils.copyBean(userBaseDto, User.class);
		//设置注册时间为当前时间
		user.setRegisterTime(LocalDateTime.now());
		//设置用户角色 默认为 2 普通用户
		user.setRoleId((short) 2);
		//设置用户会员状态 默认为 false
		user.setIsVip(false);
		//如果没有传性别,默认设置为 男
		if (user.getGender() == null) {
			user.setGender("0");
		}
		//将数据存入数据库中
		userMapper.insertUser(user);
	}


	/**
	 * 根据id查询用户
	 *
	 * @param id 用户id
	 * @return 用户数据
	 */
	@Override
	public User getUserById(Integer id) {
		User user = userMapper.getUserById(id);
		//为避免密码泄露造成安全问题,密码置空后返回
		user.setPassword(null);
		return user;
	}


	/**
	 * 修改用户
	 *
	 * @param userBaseDto 用户修改的基础数据实体
	 */
	@Override
	public void updateUser(UserBaseDto userBaseDto) {
		//在数据库中修改用户信息
		userMapper.updateUser(userBaseDto);
	}
}
